/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imp.gestores;

import imp.DAO.*;
import imp.util.*;
import imp.clases.*;

import java.util.ArrayList;

import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import org.ajax4jsf.component.html.HtmlAjaxCommandButton;

import org.richfaces.component.html.HtmlDataTable;
import org.richfaces.component.html.HtmlDataTable;

/**
 *
 * @author Alvaro Uyaguari
 */
public class GestorValoracion extends BeanUtil{

    private Emprendimiento currentEmprendimiento;
    private Comite currentComite;
    private CriterioValoracion currentCriterio;
    private Valoracion currentValoracion;

    private List<CriterioValoracion> listaCriterios;
    private List<Valoracion> listaValoraciones;
    private Set<CriterioValoracion> listaSelecionada;


    private HtmlDataTable tablaCriterios;
    private HtmlDataTable tablaValoraciones;

    private HtmlDataTable tablaComites;
    private String accionComite;
    private Boolean renderComite;
  
    //Para Buscadores
    private String filtroBusqueda;
    private String opcionVal;


    private DAO dao = (DAO)ServiceFinder.findBean("SpringHibernateDao");

    public GestorValoracion(){
        this.tablaComites=new HtmlDataTable();
        this.tablaCriterios=new HtmlDataTable();
        this.currentEmprendimiento=new Emprendimiento();
        this.currentComite=new Comite();
        this.currentCriterio=new CriterioValoracion();
        this.currentValoracion=new Valoracion();

        //Listo los criterios Disponibles:
        this.listarCriterios();
        this.ponerFechaActual();
    }

    // Para Emprendimiento:

    public String grabarEmprendimiento() {

        try {
                dao.flush();
                dao.persist(this.currentEmprendimiento);


        } catch (Exception e) {
            super.addErrorMessage(e.getMessage());
        }

        return null;
    }

    public Emprendimiento getCurrentEmprendimiento() {
        return currentEmprendimiento;
    }

    public void setCurrentEmprendimiento(Emprendimiento currentEmprendimiento) {
        this.currentEmprendimiento = currentEmprendimiento;
       
     
    }

    public void pasarParamatrosEmprendimiento(ActionEvent evento) {

        GestorEmprendimientos gestorEmprendimientos = super.getBean("gestorBuscarEmprendimientos");

        gestorEmprendimientos.setCurrentEmprendimiento(this.currentValoracion.getEmprendimiento());
        gestorEmprendimientos.setReRender("panelEvaluadores");
        gestorEmprendimientos.buscar();
        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
        boton.setOncomplete("Richfaces.showModalPanel('panelEmprendimiento')");
    }


    public void pasarParamatrosComite(ActionEvent evento) {

        GestorComites gestorComites = super.getBean("gestorBuscarComites");
        gestorComites.setCurrentComite(this.currentValoracion.getComite());
        gestorComites.setReRender("panelEvaluadores,panelObservacion");
        gestorComites.listar();
        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
        boton.setOncomplete("Richfaces.showModalPanel('panelComite')");
    }

    public void pasarParamatrosCriterio(ActionEvent evento) {

        GestorCriterios gestorCriterios = super.getBean("gestorBuscarCriterios");
        gestorCriterios.setCurrentCriterio(this.currentValoracion.getCriteriovaloracion());
        gestorCriterios.setReRender("panelCriterios,panelObservacion");
        gestorCriterios.listar();
        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
        boton.setOncomplete("Richfaces.showModalPanel('panelCriterio')");
    }



    //Metodos para Busuedas:

    public String getFiltroBusqueda() {
    return filtroBusqueda;
    }
    public void setFiltroBusqueda(String filtroBusqueda) {
    this.filtroBusqueda = filtroBusqueda;
    }

    //########## Para Comite: ########## //

        public void setCurrentComite(Comite currentComite) {
            this.currentComite = currentComite;
        }

        public Comite getCurrentComite() {
            return currentComite;
        }

    //########## Para Criterio: ########## //

    public CriterioValoracion getCurrentCriterio() {
        return currentCriterio;
    }

    public void setCurrentCriterio(CriterioValoracion currentCriterio) {
        this.currentCriterio = currentCriterio;
    }

    public List<CriterioValoracion> getListaCriterios() {
        return listaCriterios;
    }

    public void setListaCriterios(List<CriterioValoracion> listaCriterios) {
        this.listaCriterios = listaCriterios;
    }

    public Set<CriterioValoracion> getListaSelecionada() {
        return listaSelecionada;
    }

    public void setListaSelecionada(Set<CriterioValoracion> listaSelecionada) {
        this.listaSelecionada = listaSelecionada;
    }

    public HtmlDataTable getTablaCriterios() {
        return tablaCriterios;
    }

    public void setTablaCriterios(HtmlDataTable tablaCriterios) {
        this.tablaCriterios = tablaCriterios;
    }

    public void seleccionaCriterio(ActionEvent ae){
        Integer indice = (Integer) this.tablaCriterios.getRowKey();
        this.currentCriterio=this.listaCriterios.get(indice);
        this.currentValoracion.setCriteriovaloracion(currentCriterio);
   }
  
   


    public void listarCriterios(){

        try {

            listaCriterios = dao.find(CriterioValoracion.class);

        } catch (Exception e) {
            this.MostrarMensaje(e.getMessage());
        }

    }

    private void MostrarMensaje(String mensaje) {
        FacesContext context = FacesContext.getCurrentInstance();
        String msg = "Error: " + mensaje;
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg));
    }
    //########## Para Valoracion: ########## //
    

    public void listarValoraciones(){



        String where;
        if(this.currentValoracion.getEmprendimiento().getCodigo()!=-1&&this.currentValoracion.getComite().getCodigo()!=-1){
            //and vlr.comite.codigo = " +this.currentValoracion.getComite().getCodigo()+ "
            where="select vlr from Valoracion as vlr where vlr.emprendimiento.codigo = " +this.currentValoracion.getEmprendimiento().getCodigo() + " ) ";
        }else{
            where="";
        }
        //this.currentValoracion.getComite().getCodigo();


        try {

            listaValoraciones = dao.find(where);

        } catch (Exception e) {
            this.MostrarMensaje(e.getMessage());
        }

    }


    public Valoracion getCurrentValoracion() {
        return currentValoracion;
    }

    public void setCurrentValoracion(Valoracion currentValoracion) {
        this.currentValoracion = currentValoracion;
    }

    public HtmlDataTable getTablaValoraciones() {
        return tablaValoraciones;
    }

    public void setTablaValoraciones(HtmlDataTable tablaValoraciones) {
        this.tablaValoraciones = tablaValoraciones;
    }

    public List<Valoracion> getListaValoraciones() {
        return listaValoraciones;
    }

    public void setListaValoraciones(List<Valoracion> listaValoraciones) {
        this.listaValoraciones = listaValoraciones;
    }

    


     public String grabarValoracion() {
 
     if(this.opcionVal.equals("editar")){

         //En el Caso que sea una editar valoracion:
         try {
            //dao.flush();
            dao.persist(this.currentValoracion);

        } catch (Throwable ex) {
            ex.printStackTrace();
            FacesContext context = FacesContext.getCurrentInstance();
            String msg = "No se pudo actualizar la oferta. " + ex.getMessage();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg));

        } finally {//Finalizar
        }





     }
     else{
        //En el Caso que sea una nueva valoracion:
        try {
            this.currentValoracion.getEmprendimiento().setEstado("EVALUADO");

            this.currentEmprendimiento.addValoracion(currentValoracion);
            
            //dao.flush();
            dao.persist(this.currentEmprendimiento);

        } catch (Throwable ex) {
            ex.printStackTrace();
            FacesContext context = FacesContext.getCurrentInstance();
            String msg = "No se pudo actualizar la oferta. " + ex.getMessage();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg));

        } finally {//Finalizar
        }
       
        
       
     }
     return "evaluarproyectos";
    }


     public String editarValoracion(){
         this.currentValoracion = (Valoracion) tablaValoraciones.getRowData();
         this.opcionVal="editar";
         return "evaluar";

     }

     public void nuevaValoracion(ActionEvent evento) {
        
        
        try {
            currentValoracion=new Valoracion();

        } catch (Throwable ex) {
            ex.printStackTrace();
            FacesContext context = FacesContext.getCurrentInstance();
            String msg = "No se pudo actualizar la oferta. " + ex.getMessage();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg));

        } finally {//Finalizar
        }

        
        //Limpio estos datos:
        this.ponerFechaActual();
      
        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
        boton.setReRender("panelValidacion");

    }

     public String  nuevaValoracion() {

        try {
          currentValoracion=new Valoracion();

        } catch (Throwable ex) {
            ex.printStackTrace();
            FacesContext context = FacesContext.getCurrentInstance();
            String msg = "No se pudo actualizar la oferta. " + ex.getMessage();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg));

        } finally {//Finalizar
        }
       this.ponerFechaActual();
       this.opcionVal="nuevo";
       return "evaluar";



    }

    public String mostrarValorados (){

    return "evaluarproyectos";


    }

    public String regresarValoracion (){

    return "valorado";


    }




    //Ponemos el valor de la Fecha Actual cuando se crea un nuevo Comite
    public void ponerFechaActual(){
    this.currentValoracion.setFecha(new java.sql.Date(System.currentTimeMillis()));
    }


    @Override
    protected void buscar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }


}
